import { setToken, getToken, removeToken } from '@/utils/auth'
import { loginAPI, getUserProfileAPI, getUserPhotoAPI } from '@/api'
import router, { resetRouter } from '@/router' //

const getDefaultState = () => {
  return {
    token: getToken() || '', // 用户 Token，默认为 '' 默认存一份
    userInfo: {} // 员工信息对象 里面有当前员工的所有权限数据（菜单和按钮）
  }
}

const state = getDefaultState()

const mutations = {
  // 重置state里的变量
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  // 设置token
  SET_TOKEN(state, newToken) {
    state.token = newToken
    setToken(newToken)
  },
  // 移除token
  REMOVE_TOKEN(state) {
    state.token = ''
    removeToken()
  },
  // 设置用户信息对象
  SET_USER(state, value) {
    state.userInfo = value
  },
  // 删除用户信息
  REMOVE_USER(state) {
    state.userInfo = {}
  }
}

const actions = {
  // 第一个形参原本是store，但我们只为了拿到store对象里的commit,so 解构赋值
  async loginActions({ commit }, value) {
    const [err, res] = await loginAPI(value)
    // console.log(arr)
    // 只有成功才需要保存token，但提示还在外面所以最后要数组返回逻辑页面
    if (!err) commit('SET_TOKEN', res.data) // 传个新token
    return [err, res]
  },
  async getUserInfoActions({ commit }) {
    // 获取用户基本信息
    const res = await getUserProfileAPI() // 基本信息
    console.log('用户基本信息')
    console.log(res)
    const res2 = await getUserPhotoAPI(res.data.userId) // 用户头像
    commit('SET_USER', { ...res.data, ...res2.data }) // 用户数据信息存入vuex
    return res.data.roles.menus // 将当前员工的菜单权限数组返回到调用处
  },
  // 退出登录
  async logOutActions(store) {
    // 清除本地和vuex的token，跳转回login
    removeToken()
    store.commit('REMOVE_TOKEN')

    // 解决登录后，名字仍然显示上个账号名字的bug
    store.commit('RESET_STATE') // 清除vuex的token

    // 退出后，再次登陆，发现菜单异常 ，控制台有输出说路由重复
    // 路由对象也要重新生成 重置路由
    resetRouter()
    // 跳转回login 要带上当前未遂地址
    router.replace(`/login?redirect=${router.currentRoute.fullPath}`)
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

